<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="jBACd" id="jBACd"><span data-lake-id="u85b0e7b4" id="u85b0e7b4">典型回答</span></h1>
  <p data-lake-id="uf4f316d0" id="uf4f316d0"><br></p>
  <p data-lake-id="uc13ddddd" id="uc13ddddd"><span data-lake-id="ubd5ad002" id="ubd5ad002">Redis 通过设置过期时间来控制键值对的生命周期。过期时间可以通过EXPIRE、EXPIREAT、PERSIST等命令设置，也可以在插入数据时直接设置过期时间。</span></p>
  <p data-lake-id="ud91d1069" id="ud91d1069"><span data-lake-id="ud525a428" id="ud525a428">​</span><br></p>
  <p data-lake-id="u36cadbf5" id="u36cadbf5"><strong><span data-lake-id="uc473cda4" id="uc473cda4">Redis 的过期策略采用的是定期删除和惰性删除相结合的方式。</span></strong></p>
  <ul list="uf408fab5" data-lake-index-type="true">
   <li fid="u409eb6a8" data-lake-id="u0f63197f" id="u0f63197f"><strong><span data-lake-id="u80549d2f" id="u80549d2f">定期删除</span></strong><span data-lake-id="u5fed476c" id="u5fed476c">：Redis 默认每隔 100ms 就随机抽取一些设置了过期时间的 key，并检查其是否过期，如果过期就删除。定期删除是 Redis 的主动删除策略，它可以确保过期的 key 能够及时被删除，但是会占用 CPU 资源去扫描 key，可能会影响 Redis 的性能。</span></li>
  </ul>
  <p data-lake-id="u657232c8" id="u657232c8"><br></p>
  <ul list="uf408fab5" start="2" data-lake-index-type="true">
   <li fid="u409eb6a8" data-lake-id="uad947585" id="uad947585"><strong><span data-lake-id="ubea264a9" id="ubea264a9">惰性删除</span></strong><span data-lake-id="u501cf26d" id="u501cf26d">：当一个 key 过期时，不会立即从内存中删除，而是在访问这个 key 的时候才会触发删除操作。惰性删除是 Redis 的被动删除策略，它可以节省 CPU 资源，但是会导致过期的 key 始终保存在内存中，占用内存空间。</span></li>
  </ul>
  <p data-lake-id="ucb991040" id="ucb991040"><br></p>
  <p data-lake-id="ue808070a" id="ue808070a"><strong><span data-lake-id="u94056e0e" id="u94056e0e">Redis默认同时开启定期删除和惰性删除两种过期策略。</span></strong></p>
  <p data-lake-id="u3cc9753c" id="u3cc9753c"><span data-lake-id="u4bfce4d0" id="u4bfce4d0">​</span><br></p>
  <p data-lake-id="ue4cada76" id="ue4cada76"><span data-lake-id="ubdbf6191" id="ubdbf6191">定期删除会在Redis设置的过期键的过期时间达到一定阈值时进行一次扫描，将过期的键删除，但不会立即释放内存，而是把这些键标记为“已过期”，并放入一个专门的链表中。然后，在Redis的内存使用率达到一定阈值时，Redis会对这些“已过期”的键进行一次内存回收操作，释放被这些键占用的内存空间。</span></p>
  <p data-lake-id="uf8cd5f5a" id="uf8cd5f5a"><span data-lake-id="u5ff100b2" id="u5ff100b2">​</span><br></p>
  <p data-lake-id="u49a08dae" id="u49a08dae"><span data-lake-id="u041cf5b2" id="u041cf5b2">而惰性删除则是在键被访问时进行过期检查，如果过期了则删除键并释放内存。</span></p>
  <p data-lake-id="u12860332" id="u12860332"><span data-lake-id="u2841927b" id="u2841927b">​</span><br></p>
  <p data-lake-id="uc3eb232a" id="uc3eb232a"><span data-lake-id="uad5a9b37" id="uad5a9b37">需要注意的是，即使Redis进行了内存回收操作，也不能完全保证被删除的内存空间会立即被系统回收。</span></p>
  <p data-lake-id="u2c94fdbc" id="u2c94fdbc"><span data-lake-id="uf215cb66" id="uf215cb66">​</span><br></p>
  <p data-lake-id="u6d3e8e9f" id="u6d3e8e9f"><span data-lake-id="u670cad0d" id="u670cad0d">一般来说，这些被删除的内存空间会被操作系统标记为“可重用的内存”，等待被重新分配。因此，即使Redis进行了内存回收操作，也并不能保证Redis所占用的内存空间会立即释放给操作系统。</span></p>
 </body>
</html>